home *** CD-ROM | disk | FTP | other *** search
/ Over 1,000 Windows 95 Programs / Over 1000 Windows 95 Programs (Microforum) (Disc 1).iso / 1249 / polish.t < prev    next >
Text File  |  1997-04-18  |  3KB  |  153 lines

  1. %
  2. % "polish.t" performs reverse polish arithmetic
  3. %
  4. %   Sample program for the T Interpreter by:
  5. %
  6. %   Stephen R. Schmitt
  7. %   962 Depot Road
  8. %   Boxborough, MA 01719
  9. %
  10.  
  11. var R : array[64] of real               % stack
  12.  
  13. var expn : string                       % for keyboard input
  14. var i, len, n : int                     % global values
  15.  
  16. program
  17.  
  18.     var ch : string
  19.     
  20.     prompt "enter an RPN expression:"
  21.     get expn : *
  22.     put "expn: ",expn
  23.  
  24.     expn := expn & " "                  % must terminate line with space
  25.     len := length( expn )
  26.  
  27.     i := -1
  28.     n := 0
  29.     R[n] := 0.0                         % push zero for unary operations
  30.  
  31.     loop
  32.  
  33.         i := i + 1
  34.         exit when i >= len              % at end of line
  35.  
  36.         continue when expn[i] = ' '     % skip white spaces
  37.  
  38.         ch[0] := expn[i]                % for use in index
  39.         ch[1] := chr( 0 )
  40.         
  41.         if index( "0123456789", ch ) >= 0 then
  42.  
  43.             get_number
  44.  
  45.         elsif expn[i] = '+' then        % add and pop stack
  46.  
  47.             if n < 1 then
  48.  
  49.                 put "error"
  50.  
  51.             else
  52.  
  53.                 R[n-1] := R[n-1] + R[n]
  54.                 n := n - 1
  55.  
  56.             end if
  57.  
  58.         elsif expn[i] = '-' then        % subtract and pop stack
  59.  
  60.             if n < 1 then
  61.  
  62.                 put "error"
  63.  
  64.             else
  65.  
  66.                 R[n-1] := R[n-1] - R[n]
  67.                 n := n - 1
  68.  
  69.             end if
  70.  
  71.         elsif expn[i] = '*' then        % multiply and pop stack
  72.  
  73.             if n < 1 then
  74.  
  75.                 put "error"
  76.  
  77.             else
  78.  
  79.                 R[n-1] := R[n-1] * R[n]
  80.                 n := n - 1
  81.  
  82.             end if
  83.  
  84.         elsif expn[i] = '/' then        % divide and pop stack
  85.  
  86.             if n < 1 then
  87.  
  88.                 put "error"
  89.  
  90.             else
  91.  
  92.                 R[n-1] := R[n-1] / R[n]
  93.                 n := n - 1
  94.  
  95.             end if
  96.  
  97.         else
  98.  
  99.             exit
  100.  
  101.         end if
  102.  
  103.     end loop
  104.  
  105.     put "result: ", R[n]                % end of main program
  106.  
  107. end program
  108.  
  109. procedure get_number
  110.  
  111.     var ch : string
  112.     var j : int := 0                    % start of number string
  113.     var number : string                 % buffer for conversion
  114.  
  115.     i := i - 1
  116.     loop                                % get integer part
  117.  
  118.         i := i + 1
  119.         ch[0] := expn[i]                % for use in index
  120.         ch[1] := chr( 0 )
  121.         number[j] := expn[i]
  122.         j := j + 1
  123.       
  124.         continue when index( "0123456789", ch ) >= 0
  125.  
  126.         if expn[i] = '.' then          
  127.  
  128.             loop                        % get fractional part
  129.  
  130.                 i := i + 1
  131.                 ch[0] := expn[i]        % for use in index
  132.                 ch[1] := chr( 0 )
  133.                 number[j] := expn[i]
  134.                 j := j + 1
  135.  
  136.                 continue when index( "0123456789", ch ) >= 0
  137.  
  138.                 exit
  139.  
  140.             end loop
  141.  
  142.         end if
  143.  
  144.         number[j] := chr( 0 )           % null terminate string
  145.  
  146.         exit
  147.  
  148.     end loop
  149.     
  150.     n := n + 1                          % push number onto stack
  151.     R[n] := strreal( number )
  152.  
  153. end procedure